/**
 * 重写数组方法
 * 继承原来数组的功能
 * 劫持
 */
const arrayProto = Array.prototype;

// 用于创建一个新对象，新对象的原型链指向指定的对象。
export const arrayMethods = Object.create(arrayProto);

const methodsToPatch = [
  "push",
  "pop",
  "shift",
  "unshift",
  "splice",
  "sort",
  "reverse",
];

methodsToPatch.forEach(function (method) {
  const original = arrayProto[method];
  arrayMethods[method] = function (...args) {
    // 这能打印出method 是因为在这产生了闭包 导致引用一直在 未被销毁
    // console.log("走着了吗",method,this,args);
    const result = original.apply(this, args);
    const ob = this.__ob__
    
    let inserted
    // 如果数组是新增的对象等 也需要转换成响应式的 在这进行判断
    switch(method){
      case 'push':
      case 'unshift':
        inserted = args
        break
      case 'splice':
        inserted = args.slice(2)
        break
    }
    if(inserted) ob.observeArray(inserted)
    // ob.dep.notify()
    // if(ob.dep){
      ob.dep.notify()
    // }
    return result
  };
  
});
